package org.javaboy.vhr.controller.personnel;

import java.util.List;

import org.javaboy.vhr.model.Hr;
import org.javaboy.vhr.model.RespBean;
import org.javaboy.vhr.model.RespPageBean;
import org.javaboy.vhr.model.Task;
import org.javaboy.vhr.service.TaskService;
import org.javaboy.vhr.utils.POIUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.Authentication;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/task")
public class TaskController {

    @Autowired
    private TaskService taskService;

    /**
     * 获取所有任务（分页）
     * @param page 页码
     * @param size 每页大小
     * @param keyword 关键词搜索
     * @return 任务列表
     */
    // 测试通过
     @GetMapping("/getAll")
     public RespPageBean getAllTasks(@RequestParam(defaultValue = "1") Integer page,
                                    @RequestParam(defaultValue = "10") Integer size,
                                    String keyword) {
         return taskService.getAllTasks(page, size, keyword);
     }


    /**
     * 获取当前管理员发布的任务
     * @param page 页码
     * @param size 每页大小
     * @return 任务列表
     */
    @GetMapping("/hr")
    public RespPageBean getTasksByCurrentHr(@RequestParam(defaultValue = "1") Integer page,
                                           @RequestParam(defaultValue = "10") Integer size,
                                           Authentication authentication) {
        Hr currentHr = (Hr) authentication.getPrincipal();
        return taskService.getTasksByHrId(currentHr.getId(), page, size);
    }

    /**
     * 获取指定员工的任务
     * @param eid 员工ID
     * @param page 页码
     * @param size 每页大小
     * @return 任务列表
     */
    @GetMapping("/emp/{eid}")
    public RespPageBean getTasksByEmpId(@PathVariable Integer eid,
                                       @RequestParam(defaultValue = "1") Integer page,
                                       @RequestParam(defaultValue = "10") Integer size) {
        return taskService.getTasksByEmpId(eid, page, size);
    }

    /**
     * 获取当前员工的任务
     * @param page 页码
     * @param size 每页大小
     * @return 任务列表
     */
    @GetMapping("/emp")
    public RespPageBean getTasksByCurrentEmp(@RequestParam(defaultValue = "1") Integer page,
                                            @RequestParam(defaultValue = "10") Integer size,
                                            Authentication authentication) {
        Hr currentHr = (Hr) authentication.getPrincipal();
        return taskService.getTasksByEmpId(currentHr.getId(), page, size);
    }

    /**
     * 添加任务
     * @param task 任务信息
     * @return 添加结果
     */
    // 测试通过
    @PostMapping("/insert")
    public RespBean addTask(@RequestBody Task task, Authentication authentication) {
        Hr currentHr = (Hr) authentication.getPrincipal();
        task.setHid(currentHr.getId());
        if (taskService.addTask(task) == 1) {
            return RespBean.ok("添加成功!");
        }
        return RespBean.error("添加失败!");
    }
    /**
     * 更新任务
     * @param task 任务信息
     * @return 更新结果
     */
    @PutMapping("/")
    public RespBean updateTask(@RequestBody Task task) {
        if (taskService.updateTask(task) == 1) {
            return RespBean.ok("更新成功!");
        }
        return RespBean.error("更新失败!");
    }

    /**
     * 删除任务
     * @param id 任务ID
     * @return 删除结果
     */
    @DeleteMapping("/{id}")
    public RespBean deleteTask(@PathVariable Integer id) {
        if (taskService.deleteTask(id) == 1) {
            return RespBean.ok("删除成功!");
        }
        return RespBean.error("删除失败!");
    }

    /**
     * 获取任务详情
     * @param id 任务ID
     * @return 任务详情
     */
    @GetMapping("/{id}")
    public Task getTaskById(@PathVariable Integer id) {
        return taskService.getTaskById(id);
    }

    /**
     * 员工确认接收任务
     * @param id 任务ID
     * @return 操作结果
     */
    @PutMapping("/confirm/{id}")
    public RespBean confirmTask(@PathVariable Integer id) {
        if (taskService.confirmTask(id) == 1) {
            return RespBean.ok("已确认接收任务!");
        }
        return RespBean.error("确认失败!");
    }

    /**
     * 员工完成任务
     * @param id 任务ID
     * @return 操作结果
     */
    @PutMapping("/complete/{id}")
    public RespBean completeTask(@PathVariable Integer id) {
        if (taskService.completeTask(id) == 1) {
            return RespBean.ok("已完成任务!");
        }
        return RespBean.error("操作失败!");
    }

    /**
     * 管理员确认任务完成
     * @param id 任务ID
     * @return 操作结果
     */
    @PutMapping("/confirm-completion/{id}")
    public RespBean confirmTaskCompletion(@PathVariable Integer id) {
        if (taskService.confirmTaskCompletion(id) == 1) {
            return RespBean.ok("已确认任务完成!");
        }
        return RespBean.error("操作失败!");
    }

    /**
     * 取消任务
     * @param id 任务ID
     * @return 操作结果
     */
    @PutMapping("/cancel/{id}")
    public RespBean cancelTask(@PathVariable Integer id) {
        if (taskService.cancelTask(id) == 1) {
            return RespBean.ok("已取消任务!");
        }
        return RespBean.error("操作失败!");
    }

    /**
     * 导出任务数据为Excel
     *
     * @return Excel文件的字节数组
     */
    @GetMapping("/export")
    public ResponseEntity<byte[]> exportData() {
        List<Task> list = (List<Task>) taskService.getAllTasks(null, null, null).getData();
        return POIUtils.task2Excel(list);
    }

}
